package dao;

import java.util.List;
import hbt.HibernateUtil;
import negocio.Area;
import negocio.Carta;
import negocio.Producto;
import negocio.Restaurante;
import negocio.Sector;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class RestauranteDAO {
	private static RestauranteDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static RestauranteDAO getInstancia()
	{
		if(instancia == null)
		{
			sf = HibernateUtil.getSessionFactory();
			instancia = new RestauranteDAO();
		} 
		return instancia;
	}
	
	private Session getSession()
	{
		if(session == null || !session.isOpen())
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) session.close();
	}
	
	public void perisitRestaurante(Restaurante restaurante)
	{
		Session s=getSession();
		s.beginTransaction();
		s.persist(restaurante);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}
	
	public Restaurante getRestauranteById(int id)
	{
		Session s=getSession();
		s.beginTransaction();
		Restaurante r = (Restaurante) s.get(Restaurante.class, id);
		s.flush();
		closeSession();
		return r;
	}

	@SuppressWarnings("unchecked")
	public List<Restaurante> getRestaurantes()
	{
		Session s = getSession();
		List<Restaurante> r = s.createQuery("from Restaurante").list();
		closeSession();
		return r;
	}
	
	public Restaurante getRestauranteByNombre(String nombre)
	{
		Session s=getSession();
		Restaurante r = (Restaurante) 
				s.createQuery("from Restaurante where nombre = :nombre")
				.setString("nombre", nombre)
				.uniqueResult();
		closeSession();
		return r;
	}
	
	public void updateRestaurante(Restaurante restaurante)
	{
		Session s=getSession();
		s.beginTransaction();
		s.update(restaurante);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}
	
	public void updateArea(Area area)
	{
		Session s=getSession();
		s.beginTransaction();
		s.update(area);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}
	
	public void updateCarta(Carta carta)
	{
		Session s=getSession();
		s.beginTransaction();
		s.update(carta);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}

	public void persistProducto(Producto producto) {
		Session s=getSession();
		s.beginTransaction();
		s.persist(producto);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}

	public Sector getSectorByNombre(String nombreSector) {
		Session s=getSession();
		Sector sector = (Sector) 
				s.createQuery("from Sector where nombre = :nombre")
				.setString("nombre", nombreSector)
				.uniqueResult();
		closeSession();
		return sector;
	}

	public Area getArea(String nombreArea, Restaurante restaurante) {
		String query = "";
		switch (nombreArea.toLowerCase()) {
		case "cocina":
			query = "select cocina from Restaurante where idRastaurante = :idRastaurante";
			break;
		case "barra":
			query = "select barra from Restaurante where idRastaurante = :idRastaurante";
			break;
		case "cafeteria":
			query = "select cafeteria from Restaurante where idRastaurante = :idRastaurante";
			break;
		default:
			break;
		}
		
		Session s=getSession();
		Area area = (Area)
				s.createQuery(query)
				.setInteger("idRastaurante", restaurante.getIdRastaurante())
				.uniqueResult();
		closeSession();
		return area;
	}
}
